﻿using System.Text;
using System.Net.Sockets;
using System.Net;
using System;
using Protocolo.Mensajes.Request;

namespace Protocolo
{
    public class ComunicacionUDP
    {
        internal static void EnviarBroadcastUDP(string mensaje, int puertoUDP)
        {
            UdpClient udpClient = null;
            try
            {
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Broadcast, puertoUDP);
                udpClient = new UdpClient();
                byte[] mensajeAEnviar = Encoding.ASCII.GetBytes(mensaje);
                udpClient.Connect(endpoint);
                udpClient.Send(mensajeAEnviar, mensajeAEnviar.Length);
            }
            catch (Exception ex)
            {
                throw new Exception("Error enviando mensaje UDP: " + ex.Message);
            }
            finally
            {
                if(udpClient != null)
                    udpClient.Close();
            }
        }

        internal static void EnviarMensajeUDP(string mensaje, string ip, int puertoUDP)
        {
            UdpClient udpClient = null;
            try
            {
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), puertoUDP);
                udpClient = new UdpClient();
                byte[] mensajeAEnviar = Encoding.ASCII.GetBytes(mensaje);
                udpClient.Connect(endpoint);
                udpClient.Send(mensajeAEnviar, mensajeAEnviar.Length);
                udpClient.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("Error enviando mensaje UDP: " + ex.Message);
            }
            finally
            {
                if (udpClient != null)
                    udpClient.Close();
            }
        }

        internal static string RecibirMensajeUDP(int puertoUDP)
        {
            UdpClient udpClient = null;
            try
            {
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, puertoUDP);
                IPEndPoint remoteEndPoint = null;
                udpClient = new UdpClient();
                udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                udpClient.Client.Bind(endpoint);

                byte[] mensajeRecibido = udpClient.Receive(ref remoteEndPoint);

                return Encoding.ASCII.GetString(mensajeRecibido, 0, mensajeRecibido.Length);
            }
            catch (Exception ex)
            {
                throw new Exception("Error recibiendo mensaje UDP: " + ex.Message);
            }
            finally
            {
                if (udpClient != null)
                    udpClient.Close();
            }
        }
    }
}
